package com.study.util;

import com.study.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class CacheUtil {

    //@Cacheable可以标记在一个方法上，也可以标记在一个类上，当标记在一个方法上时表示该方法是支持缓存的，当标记在一个类上时则表示该类所有的方法都是支持缓存的。
    //@Cacheable 在方法执行前Spring先是否有缓存数据，如果有直接返回。如果没有数据，调用方法并将方法返回值存放在缓存当中。
    @Cacheable(value = "user", key = "#user.name")
    public User getUser(User user){
        log.info("get user");
        return user;
    }

    //@CachePut 无论怎样，都将方法的返回结果放到缓存当中。
    @CachePut(value = "user", key = "#user.name")
    public User saveUser(User user){
        log.info("save user");
        return user;
    }

    @CacheEvict(value = "user", key = "#name") // 移除指定key的数据
    public void deleteUser(String name){
        log.info("delete user");
    }

    @CacheEvict(value = "user", allEntries = true) // 移除所有数据
    public void deleteAll() {
        log.info("delete All");
    }

    @Cacheable(value = "user", key = "#name",unless = "#result == null",condition = "#a0>1")
    //unless = "#result == null"  当unless指定的条件为true，方法的返回值就不会被缓存；可以获取到的结果进行  判断unless = “#result == null”  结果为null不缓存
    //condition：指定符合条件的情况下才缓存； 如：condition = "#a0>1"  即第一个参数值大于1时才进行缓存
    public User getUserByName(String name){
        log.info("get user");
        return null;
    }

}